
//返回一个没有参数的函数
function create(){
    var num = 3;
    return function(){
        var n = 0;
        console.log(++n);
        console.log(++num);
    }
}
var fn = create();

console.log(fn());
console.log(fn());

//用for循环返回的函数
//乘法   用加法和乘法差不多  
function gow(){
    var arr = [];
    for (var i = 1; i <= 5; i++) {
        arr.push((function(x){
            return function(){
                return x * x;
            }
        })(i))
        
    }
    return arr;

}
var gw = gow();

var f1 = gw[0];
var f2 = gw[1]
var f3 = gw[2]
var f4 = gw[3]
var f5 = gw[4]
console.log(f1());
console.log(f2());
console.log(f3());
console.log(f4());
console.log(f5());

//计数器

function count(i){
        var x = i || 0;//默认值为零或者初始化值为零；
        return {
            bag:function(){
                x += 1;
                return x;
            }
        }
}

var an = count();
//没有给参数传值；
console.log(an.bag());
console.log(an.bag());
console.log(an.bag());

var an1 = count(12);
//给参数传值；
console.log(an1.bag());
console.log(an1.bag());
console.log(an1.bag());

// 闭包还可以把多参数的函数变成单参数的函数。例如，要计算xy可以用Math.pow(x, y)函数，
// 不过考虑到经常计算x2或x3，我们可以利用闭包创建新的函数pow2和pow3：
//运用math函数方法

function make_pow(a){
    return function(b){
        return Math.pow(a,b)
    }
}
var a1 = make_pow(4);    
var b1 = make_pow(5);
console.log(a1(2));
console.log(b1(5));

//定时器
for (var i = 1; i <= 5; i++) {
    (function(i){
        setTimeout(function(){
            console.log(i);
        },i * 100);
    })(i)
    
}
//每隔一百毫秒执行一次，一共执行五次。